import { defineConfig, loadEnv, type ViteDevServer } from 'vite';
import { resolve } from 'path';
import vue from '@vitejs/plugin-vue';
import { codeInspectorPlugin } from 'code-inspector-plugin';
import vueJsx from '@vitejs/plugin-vue-jsx'; // 支持 JSX/TSX
import Components from 'unplugin-vue-components/vite';
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
import dns from 'dns';
import os from 'os';

// 强制使用 localhost 而非 127.0.0.1
dns.setDefaultResultOrder('verbatim');

// ANSI 颜色转义序列
const colors = {
  reset: '\x1b[0m', // 重置颜色
  green: '\x1b[32m', // 绿色
  cyan: '\x1b[36m', // 青色
  blue: '\x1b[34m', // 蓝色
  yellow: '\x1b[33m', // 黄色
};

// 自定义插件：修改启动输出的地址
function customOutputPlugin() {
  return {
    name: 'custom-output',
    configureServer(server: ViteDevServer) {
      // 保存原始的打印函数
      // const originalPrintUrls = server.printUrls;

      // 重写打印函数
      server.printUrls = function () {
        // 先执行原始打印（可选）
        // originalPrintUrls.call(this)

        // 获取服务器配置
        const config = server.config;
        const port = config.server.port || 5173;
        // const host = config.server.host || 'localhost';

        // 构建带 /admin_login 的地址
        const localUrl = `http://localhost:${port}/admin_login`;
        let networkUrls = [];

        // 获取网络地址
        if (server.httpServer) {
          const addresses = server.httpServer.address();
          if (addresses && typeof addresses !== 'string') {
            const interfaces = os.networkInterfaces();
            for (const devName in interfaces) {
              const iface = interfaces[devName] || [];
              for (let i = 0; i < iface.length; i++) {
                const alias = iface[i];
                if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
                  networkUrls.push(`http://${alias.address}:${port}/admin_login`);
                }
              }
            }
          }
        }

        // 自定义输出格式(带颜色的输出)
        console.log(`${colors.green}  ➜  ${colors.reset}Local:   ${colors.cyan}${localUrl}${colors.reset}`);
        networkUrls.forEach((url) => {
          console.log(`${colors.green}  ➜  ${colors.reset}Network: ${colors.cyan}${url}${colors.reset}`);
        });
      };
    },
  };
}

// https://vite.dev/config/
export default defineConfig(({ mode }) => {
  // 获取 .env.xxx 文件中的环境变量
  const env = loadEnv(mode, process.cwd());

  return {
    base: process.env.NODE_ENV === 'production' ? '/' : '/',
    root: process.cwd(),
    plugins: [
      vue(),
      vueJsx(),
      // 同时按住 Shift + Alt 点击页面元素可定位至编辑器源代码
      codeInspectorPlugin({
        bundler: 'vite',
        editor: 'code',
        // showSwitch: true,
      }),
      Components({
        resolvers: [
          AntDesignVueResolver({
            importStyle: 'less',
          }),
        ],
      }),
      customOutputPlugin(),
    ],
    resolve: {
      alias: {
        '@': resolve(__dirname, './src'), // 与 tsconfig 中的 @ 映射保持一致
      },
    },
    // 服务端口
    server: {
      host: '0.0.0.0',
      port: 5173,
    },
    build: {
      // 清除console和debugger
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true,
        },
      },
      rollupOptions: {
        output: {
          //配置这个是让不同类型文件放在不同文件夹，不会显得太乱
          chunkFileNames: 'js/[name]-[hash].js',
          entryFileNames: 'js/[name]-[hash].js',
          assetFileNames: '[ext]/[name]-[hash].[ext]',
          manualChunks(id) {
            //静态资源分拆打包
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          },
        },
      },
      target: 'esnext',
      outDir: 'dist', // 指定输出路径
      assetsDir: 'assets', // 指定生成静态文件目录
      assetsInlineLimit: 4096, // 小于此阈值的导入或引用资源将内联为 base64 编码
      chunkSizeWarningLimit: 500, // chunk 大小警告的限制
      minify: 'terser', // 混淆器，terser构建后文件体积更小
      emptyOutDir: true, //打包前先清空原有打包文件
    },
    css: {
      preprocessorOptions: {
        less: {
          javascriptEnabled: true,
        },
      },
    },
    define: {
      'process.env': {
        NODE_ENV: env.NODE_ENV,
        VITE_APP_TITLE: env.VITE_APP_TITLE,
        VITE_APP_API_URL: env.VITE_APP_API_URL,
      },
    },
  };
});
